今天要來進入到我也很害怕的閉包,因為我有時候也看不太懂在說什麼,但藉由這個機會,在寫了一些東西後的我,可不可以明白一點他的概念。
閉包是自包含的函數代碼塊,可以在代碼中被傳遞和使用。
有時候想傳東西不一定要用 protocol 傳,也可以使用閉包傳,就看自己如何設計。
閉包可以捕獲和存儲其所在上下文中任意常量和變量的引用。被稱為包裹常量和變量。
在 函數 章節我們有介紹到全局跟嵌套函數都是特殊的閉包。
閉包使用以下三種形式:
Swift 的閉包表達式擁有簡潔的風格,並鼓勵在常見場景中進行語法優化,主要優化如下:
func backward(_ s1: String, _ s2: String) -> Bool {
return s1 > s2
}
var reversedNames = names.sorted(by: backward)
// reversedNames 为 ["Ewa", "Daniella", "Chris", "Barry", "Alex"]
這邊是一個簡單的排序方法, sorted(by:) 裡面可以帶一個閉包。
{ (parameters) -> return type in
statements
}
依照上面排序方法的例子可以寫成一個閉包的方式。
reversedNames = names.sorted(by: { (s1: String, s2: String) -> Bool in
return s1 > s2
})
因為他的東西不多可以直接縮成一排
reversedNames = names.sorted(by: { (s1: String, s2: String) -> Bool in return s1 > s2 } )
繼續接續著排序方法的例子,因 sorted(by:) 本身後面就是要 (String, String) -> Bool 所以參數裡面的可以省略也可以正常運行。
reversedNames = names.sorted(by: { s1, s2 in return s1 > s2 } )
簡單來說就是可以把 return 省略
reversedNames = names.sorted(by: { s1, s2 in s1 > s2 } )
可以使用 $0 $1 $2 來調用閉包裡面的參數。
所以上面的例子可以寫成
reversedNames = names.sorted(by: { $0 > $1 } )
剛好 sorted(by:) 可以簡單地用運算符來實現函數裡面的方法。
reversedNames = names.sorted(by: > )
今天就先到這裡,我們明天再來繼續。